// 封装集合类
class Set {
  items = {};
  length = 0;

  constructor(...arrSet) {
    let index = 0;
    while (index < arrSet.length) {
      this.add(arrSet[index]);
      index++;
    }
  }

  // 1.向集合中添加一个新的项
  // @param {string} value 需要添加的属性值
  add(value) {
    if (this.has(value)) return false;
    this.items[value] = value;
    return true;
  }

  // 2.从集合从移除一个值
  // @param {string} value 需要移除的属性值
  remove(value) {
    if (this.has(value)) return delete this.items[value];
    return false;
  }

  // 3.如果值在集合中, 返回true, 否则返回false
  has(value) {
    // Object.hasOwnProperty() 判断某个属性是否在对象中存在
    // return this.items.hasOwnProperty(value);
    return this.items[value] ? true : false;
  }

  // 4.移除集合中所有项
  clear() {
    this.items = {};
    return true;
  }

  // 5.返回集合中元素个数
  size() {
    let count = 0;
    for (let key in this.items) count += 1;
    return count;
  }

  // 6.返回一个包含集合中所有属性值的数组
  values() {
    let resultList = [];
    for (let key in this.items) {
      resultList.push(this.items[key]);
    };
    return resultList;
  }

  // 集合之间的操作
  // 求并集
  union(otherSet) {
    let newSet = new Set();
    let currentSet = this.values();
    otherSet = otherSet.values();
    for (let i = 0; i < currentSet.length; i++) newSet.add(currentSet[i]);
    // add方法内已经做好了判断属性值是否存在的操作了 我们这里不用判断也可以
    for (let i = 0; i < otherSet.length; i++) newSet.add(otherSet[i]);
    return newSet;
  }

  // 求交集
  intersection(otherSet) {
    let newSet = new Set();
    let currentSet = this.values();
    // otherSet = otherSet.values();
    for (let i = 0; i < currentSet.length; i++) if (otherSet.has(currentSet[i])) newSet.add(currentSet[i]);
    return newSet;
  }

  // 求差集
  difference(otherSet) {
    let newSet = new Set();
    let currentSet = this.values();
    // otherSet = otherSet.values();
    for (let i = 0; i < currentSet.length; i++) if (!otherSet.has(currentSet[i])) newSet.add(currentSet[i]);
    return newSet;
  }

  // 求子集
  subset(otherSet) {
    let currentSet = this.values();
    for (let i = 0; i < currentSet.length; i++) if (!otherSet.has(currentSet[i])) return false;
    return true;
  }
}

const mySet = new Set();


mySet.add("111");
mySet.add("111");
mySet.add("adb");
mySet.add("小陈");

console.log(mySet.values());
console.log(mySet.size());
console.log(mySet.has(111));
console.log(mySet.remove(111));
console.log(mySet.remove(111));
console.log(mySet.values());
console.log(mySet.clear());
console.log(mySet.values());

console.log("\n");

const mySet1 = new Set(1, 2, 3, 4);
const mySet2 = new Set(4, 5, 6, 7);

// 1.求并集
console.log(mySet1.union(mySet2).values()); // 1 2 3 4 5 6 7

// 2.求交集: 即存在A集合中也存在B集合中
console.log(mySet1.intersection(mySet2).values()); // 4

// 3.求差集: 主要是谁和谁的差集 
// A和B差集表示为: A中有的, B没有的
// B和A差集表示为: B中有的, A没有的
console.log(mySet1.difference(mySet2).values()); // 1 2 3
console.log(mySet2.difference(mySet1).values()); // 5 6 7

// 4.子集: 主要是谁是的子集
// A是不是B子集? 看A里面的集合项B里面是不是都有
// B是不是A子集? 反之
const A = new Set(1, 2, 3, 4);
const B = new Set(1, 2, 3, 4, 5);
console.log(A.subset(B)); // true
console.log(B.subset(A)); // false